home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / dev / if_iereg.h < prev    next >
C/C++ Source or Header  |  1990-12-19  |  9KB  |  270 lines

  1.  
  2. /*    @(#)if_iereg.h 1.1 86/09/27 SMI    */
  3.  
  4. /*
  5.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  6.  */
  7.  
  8. /*
  9.  * Control block definitions for Intel 82586 (Ethernet) chip
  10.  * All fields are byte-swapped because the damn chip wants bytes
  11.  * in Intel byte order only, so we swap everything going to it.
  12.  */
  13.  
  14. /* byte-swapped data types */
  15. typedef u_short ieoff_t;    /* control block offsets from iscp cbbase */
  16. #define    IENORBD    0xffff        /* null pointer for rbd */
  17. typedef short ieint_t;        /* 16 bit integers */
  18. typedef    long ieaddr_t;        /* data (24-bit) addresses */
  19.  
  20. /*
  21.  * System Configuration Pointer
  22.  * Must be at 0xFFFFF6 in chip's address space
  23.  */
  24. #define IESCPADDR 0xFFFFF6
  25. struct iescp {
  26.     char    ie_sysbus;    /* bus width: 0 => 16, 1 => 8 */
  27.     char    ie_junk1[5];    /* unused */
  28.     ieaddr_t ie_iscp;    /* address of iscp */
  29. };
  30.  
  31. /*
  32.  * Intermediate System Configuration Pointer
  33.  * Specifies base of all other control blocks and the offset of the SCB
  34.  */
  35. struct ieiscp {
  36.     char    ie_busy;    /* 1 => initialization in progress */
  37.     char    ie_junk2;    /* unused */
  38.     ieoff_t    ie_scb;        /* offset of SCB */
  39.     ieaddr_t ie_cbbase;    /* base of all control blocks */
  40. };
  41.  
  42. /* 
  43.  * System Control Block - the focus of communication
  44.  */
  45. struct iescb {
  46.     u_char        : 1;    /* mbz */
  47.     u_char    ie_rus    : 3;    /* receive unit status */
  48.     u_char        : 4;    /* mbz */
  49.     u_char    ie_cx    : 1;    /* command done (interrupt) */
  50.     u_char    ie_fr    : 1;    /* frame received (interrupt) */
  51.     u_char    ie_cnr    : 1;    /* command unit not ready */
  52.     u_char    ie_rnr    : 1;    /* receive unit not ready */
  53.     u_char        : 1;    /* mbz */
  54.     u_char    ie_cus    : 3;    /* command unit status */
  55.     short    ie_cmd;        /* command word */
  56.     ieoff_t    ie_cbl;        /* command list */
  57.     ieoff_t    ie_rfa;        /* receive frame area */
  58.     ieint_t    ie_crcerrs;    /* count of CRC errors */
  59.     ieint_t    ie_alnerrs;    /* count of alignment errors */
  60.     ieint_t    ie_rscerrs;    /* count of discarded packets */
  61.     ieint_t    ie_ovrnerrs;    /* count of overrun packets */
  62. };
  63.  
  64. /* ie_rus */
  65. #define    IERUS_IDLE    0
  66. #define    IERUS_SUSPENDED    1
  67. #define    IERUS_NORESOURCE 2
  68. #define    IERUS_READY    4
  69.  
  70. /* ie_cus */
  71. #define    IECUS_IDLE    0
  72. #define    IECUS_SUSPENDED    1
  73. #define    IECUS_READY    2
  74.  
  75. /* ie_cmd */
  76. #define    IECMD_RESET    0x8000    /* reset chip */
  77. #define    IECMD_RU_START    (1<<12)    /* start receiver unit */
  78. #define    IECMD_RU_RESUME    (2<<12)    /* resume receiver unit */
  79. #define    IECMD_RU_SUSPEND (3<<12) /* suspend receiver unit */
  80. #define    IECMD_RU_ABORT    (4<<12)    /* abort receiver unit */
  81. #define    IECMD_ACK_CX    0x80    /* ack command executed */
  82. #define    IECMD_ACK_FR    0x40    /* ack frame received */
  83. #define    IECMD_ACK_CNR    0x20    /* ack CU not ready */
  84. #define    IECMD_ACK_RNR    0x10    /* ack RU not ready */
  85. #define    IECMD_CU_START    1    /* start receiver unit */
  86. #define    IECMD_CU_RESUME    2    /* resume receiver unit */
  87. #define    IECMD_CU_SUSPEND 3    /* suspend receiver unit */
  88. #define    IECMD_CU_ABORT    4    /* abort receiver unit */
  89.  
  90. /*
  91.  * Generic command block
  92.  */
  93. struct    iecb {
  94.     u_char        : 8;    /* part of status */
  95.     u_char    ie_done : 1;    /* command done */
  96.     u_char    ie_busy : 1;    /* command busy */
  97.     u_char    ie_ok    : 1;    /* command successful */
  98.     u_char    ie_aborted : 1;    /* command aborted */
  99.     u_char        : 4;    /* more status */
  100.     u_char        : 5;    /* unused */
  101.     u_char    ie_cmd    : 3;    /* command # */
  102.     u_char    ie_el    : 1;    /* end of list */
  103.     u_char    ie_susp    : 1;    /* suspend when done */
  104.     u_char    ie_intr : 1;    /* interrupt when done */
  105.     u_char        : 5;    /* unused */
  106.     ieoff_t    ie_next;    /* next CB */
  107. };
  108.  
  109. /*
  110.  * CB commands (ie_cmd)
  111.  */
  112. #define    IE_NOP        0
  113. #define    IE_IADDR    1    /* individual address setup */
  114. #define    IE_CONFIG    2    /* configure */
  115. #define    IE_MADDR    3    /* multicast address setup */
  116. #define    IE_TRANSMIT    4    /* transmit */
  117. #define    IE_TDR        5    /* TDR test */
  118. #define    IE_DUMP        6    /* dump registers */
  119. #define    IE_DIAGNOSE    7    /* internal diagnostics */
  120.  
  121. /*
  122.  * TDR command block 
  123.  */
  124. struct ietdr {
  125.     struct iecb ietdr_cb;    /* common command block */
  126.     u_char    ietdr_timlo: 8;    /* time */
  127.     u_char    ietdr_ok   : 1;    /* link OK */
  128.     u_char    ietdr_xcvr : 1;    /* transceiver bad */
  129.     u_char    ietdr_open : 1;    /* cable open */
  130.     u_char    ietdr_shrt : 1;    /* cable shorted */
  131.     u_char           : 1;
  132.     u_char    ietdr_timhi: 3;    /* time */
  133. };
  134.  
  135. /*
  136.  * Individual address setup command block
  137.  */
  138. struct ieiaddr {
  139.     struct iecb ieia_cb;    /* common command block */
  140.     char    ieia_addr[6];    /* the actual address */
  141. };
  142.  
  143. /*
  144.  * Configure command
  145.  */
  146. struct ieconf {
  147.     struct iecb ieconf_cb;    /* command command block */
  148.     u_char           : 4;
  149.     u_char    ieconf_bytes : 4;    /* # of conf bytes */
  150.     u_char           : 4;
  151.     u_char    ieconf_fifolim : 4;    /* fifo limit */
  152.     u_char    ieconf_savbf : 1;    /* save bad frames */
  153.     u_char    ieconf_srdy  : 1;    /* srdy/ardy (?) */
  154.     u_char           : 6;
  155.     u_char    ieconf_extlp : 1;    /* external loopback */
  156.     u_char    ieconf_intlp : 1;    /* external loopback */
  157.     u_char    ieconf_pream : 2;    /* preamble length code */
  158.     u_char    ieconf_acloc : 1;    /* addr&type fields separate */
  159.     u_char    ieconf_alen  : 3;    /* address length */
  160.     u_char    ieconf_bof   : 1;    /* backoff method */
  161.     u_char    ieconf_exprio : 3;    /* exponential prio */
  162.     u_char           : 1;
  163.     u_char    ieconf_linprio : 3;    /* linear prio */
  164.     u_char    ieconf_space : 8;    /* interframe spacing */
  165.     u_char    ieconf_slttml : 8;    /* low bits of slot time */
  166.     u_char    ieconf_retry : 4;    /* # xmit retries */
  167.     u_char           : 1;
  168.     u_char    ieconf_slttmh : 3;    /* high bits of slot time */
  169.     u_char    ieconf_pad    : 1;    /* flag padding */
  170.     u_char    ieconf_hdlc   : 1;    /* HDLC framing */
  171.     u_char    ieconf_crc16  : 1;    /* CRC type */
  172.     u_char    ieconf_nocrc  : 1;    /* disable CRC appending */
  173.     u_char    ieconf_nocarr : 1;    /* no carrier OK */
  174.     u_char    ieconf_manch  : 1;    /* Manchester encoding */
  175.     u_char    ieconf_nobrd  : 1;    /* broadcast disable */
  176.     u_char    ieconf_promisc : 1;    /* promiscuous mode */
  177.     u_char    ieconf_cdsrc  : 1;    /* CD source */
  178.     u_char    ieconf_cdfilt : 3;    /* CD filter bits (?) */
  179.     u_char    ieconf_crsrc  : 1;    /* carrier source */
  180.     u_char    ieconf_crfilt : 3;    /* carrier filter bits */
  181.     u_char    ieconf_minfrm : 8;    /* min frame length */
  182.     u_char           : 8;
  183. };
  184.  
  185. /*
  186.  * Receive frame descriptor
  187.  */
  188. struct    ierfd {
  189.     u_char    ierfd_short    : 1;    /* short frame */
  190.     u_char    ierfd_noeof    : 1;    /* no EOF (bitstuffing mode only) */
  191.     u_char            : 6;    /* unused */
  192.     u_char    ierfd_done    : 1;    /* command done */
  193.     u_char    ierfd_busy    : 1;    /* command busy */
  194.     u_char    ierfd_ok    : 1;    /* command successful */
  195.     u_char            : 1;    /* unused */
  196.     u_char    ierfd_crcerr    : 1;    /* crc error */
  197.     u_char    ierfd_align    : 1;    /* alignment error */
  198.     u_char    ierfd_nospace    : 1;    /* out of buffer space */
  199.     u_char    ierfd_overrun    : 1;    /* DMA overrun */
  200.     u_char            : 8;    /* unused */
  201.     u_char    ierfd_el    : 1;    /* end of list */
  202.     u_char    ierfd_susp    : 1;    /* suspend when done */
  203.     u_char            : 6;    /* unused */
  204.     ieoff_t    ierfd_next;        /* next RFD */
  205.     ieoff_t    ierfd_rbd;        /* pointer to buffer descriptor */
  206.     u_char    ierfd_dhost[6];        /* destination address field */
  207.     u_char    ierfd_shost[6];        /* source address field */
  208.     u_short    ierfd_type;        /* Ethernet packet type field */
  209. };
  210.  
  211. /*
  212.  * Receive buffer descriptor
  213.  */
  214. struct    ierbd {
  215.     u_char    ierbd_cntlo    : 8;    /* Low order 8 bits of count */
  216.     u_char    ierbd_eof    : 1;    /* last buffer for this packet */
  217.     u_char    ierbd_used    : 1;    /* EDLC sets when buffer is used */
  218.     u_char    ierbd_cnthi    : 6;    /* High order 6 bits of count */
  219.     ieoff_t    ierbd_next;        /* next RBD */
  220.     ieaddr_t ierbd_buf;        /* pointer to buffer */
  221.     u_char    ierbd_sizelo    : 8;    /* Low order 8 bits of buffer size */
  222.     u_char    ierbd_el    : 1;    /* end-of-list if set */
  223.     u_char            : 1;    /* unused */
  224.     u_char    ierbd_sizehi    : 6;    /* High order 6 bits of buffer size */
  225. #ifdef KERNEL
  226.     struct ieipack *ierbd_iep;    /* ptr to data packet descriptor */
  227. #endif
  228. };
  229.  
  230. /*
  231.  * Transmit frame descriptor ( Transmit command block )
  232.  */
  233. struct    ietfd {
  234.     u_char    ietfd_defer    : 1;    /* transmission deferred */
  235.     u_char    ietfd_heart    : 1;    /* Heartbeat */
  236.     u_char    ietfd_xcoll    : 1;    /* Too many collisions */
  237.     u_char            : 1;    /* unused */
  238.     u_char    ietfd_ncoll    : 4;    /* Number of collisions */
  239.     u_char    ietfd_done    : 1;    /* command done */
  240.     u_char    ietfd_busy    : 1;    /* command busy */
  241.     u_char    ietfd_ok    : 1;    /* command successful */
  242.     u_char    ietfd_aborted    : 1;    /* command aborted */
  243.     u_char            : 1;    /* unused */
  244.     u_char    ietfd_nocarr    : 1;    /* No carrier sense */
  245.     u_char    ietfd_nocts    : 1;    /* Lost Clear to Send */
  246.     u_char    ietfd_underrun    : 1;    /* DMA underrun */
  247.     u_char            : 5;    /* unused */
  248.     u_char    ietfd_cmd    : 3;    /* command # */
  249.     u_char    ietfd_el    : 1;    /* end of list */
  250.     u_char    ietfd_susp    : 1;    /* suspend when done */
  251.     u_char    ietfd_intr    : 1;    /* interrupt when done */
  252.     u_char            : 5;    /* unused */
  253.     ieoff_t    ietfd_next;        /* next RFD */
  254.     ieoff_t    ietfd_tbd;        /* pointer to buffer descriptor */
  255.     u_char    ietfd_dhost[6];        /* destination address field */
  256.     u_short    ietfd_type;        /* Ethernet packet type field */
  257. };
  258.  
  259. /*
  260.  * Transmit buffer descriptor
  261.  */
  262. struct    ietbd {
  263.     u_char     ietbd_cntlo    : 8;    /* Low order 8 bits of count */
  264.     u_char     ietbd_eof    : 1;    /* last buffer for this packet */
  265.     u_char            : 1;    /* unused */
  266.     u_char     ietbd_cnthi    : 6;    /* High order 6 bits of count */
  267.     ieoff_t     ietbd_next;        /* next TBD */
  268.     ieaddr_t ietbd_buf;        /* pointer to buffer */
  269. };
  270.